//
//  EmoticonViewModel.swift
//  01-表情键盘
//
//  Created by male on 15/10/23.
//  Copyright © 2015年 itheima. All rights reserved.
//

import UIKit

// MARK: - 表情包管理器 - emoticon.plist
/**
    1. emoticons.plist 定义表情包数组
        packages 字典数组中，每一个 id 对应不同表情包的目录
    2. 从 每一个表情包目录中，加载 info.plist 可以获得不同的表情内容
    id	目录名
    group_name_cn	表情分组名称- 显示在 toolbar 上
    emoticons	 数组
    字典
    chs		发送给服务器的字符串
    png		在本地显示的图片名称
    code	emoji 的字符串编码

*/
class EmoticonManager {

    /// 单例
    static let sharedManager = EmoticonManager()
    
    /// 表情包模型
    lazy var packages = [EmoticonPackage]()
    
    // MARK: - 构造函数
    private init() {
        loadPlist()
    }
    
    /**
     添加常用表情
     
     - parameter em: 表情模型
     */
    func addFavourite(em:Emoticon){
        // 0.增加使用次数
        em.times++
        
        // 1. 判断 packages[0] 中是否包含em
        if !packages[0].emoticons.contains(em){
            packages[0].emoticons.insert(em, atIndex: 0)
            // 删除倒数第二个表情
            packages[0].emoticons.removeAtIndex(packages[0].emoticons.count - 2)
            
        }
        // 2. 排序
        packages[0].emoticons.sortInPlace {
            $0.times > $1.times
        }
    }
    
    func emoticonText(string:String, font: UIFont) -> NSAttributedString{
        let strM = NSMutableAttributedString(string: string)
        
        // 1.正则表达式
        let pattern = "\\[.*?\\]"
        // 定义正则
        let regex = try! NSRegularExpression(pattern: pattern, options: [])
        
        let results = regex.matchesInString(string,
            options: [],
            range: NSRange(location: 0, length: string.characters.count))
        
        var count = results.count
        // 倒着遍历
        while count > 0 {
            let result = results[--count]
            
            let range = result.rangeAtIndex(0)
            let emStr = (string as NSString).substringWithRange(range)
            
            if let em = emoticon(emStr) {
                let imageText = EmoticonAttachment(emoticon: em).imageText(font)
                strM.replaceCharactersInRange(range, withAttributedString: imageText)
            }
        }
        
        return strM.copy() as! NSAttributedString

    }
    
    /**
     遍历表情数组查找字符串对应的表情
     
     - parameter string: [爱你]
     
     - returns: 表情模型
     */
    private func emoticon(string:String) -> Emoticon?{
        for p in packages{
            // 在数组中过滤所有
            if let em = p.emoticons.filter({$0.chs == string}).last{
                return em
            }
        }
        return nil
    }
    
    /// 从 emoticons.plist 加载表情包数据
    private func loadPlist() {
        // 0. 添加最近的分组
        packages.append(EmoticonPackage(dict: ["group_name_cn": "最近A"]))
        
        // 1. 加载 emoticon.plist － 如果文件不存在，path == nil
        let path = NSBundle.mainBundle().pathForResource("emoticons.plist", ofType: nil, inDirectory: "Emoticons.bundle")!
        
        // 2. 加载`字典`
        let dict = NSDictionary(contentsOfFile: path) as! [String: AnyObject]
        
        // 3. 从字典中获得 id 的数组 - valueForKey 直接获取字典数组中的 key 对应的数组
        let array = (dict["packages"] as! NSArray).valueForKey("id")
        
        // 4. 遍历 id 数组，准备加载 info.plist
        for id in array as! [String] {
            loadInfoPlist(id)
        }
        
    }
    
    /// 加载每一个 id 目录下的 info.plist
    private func loadInfoPlist(id: String) {
        // 1. 建立路径
        let path = NSBundle.mainBundle().pathForResource("info.plist", ofType: nil, inDirectory: "Emoticons.bundle/\(id)")!
        
        // 2. 加载字典 - 一个独立的表情包
        let dict = NSDictionary(contentsOfFile: path) as! [String: AnyObject]
        
        // 3. 字典转模型追加到 packages 数组
        packages.append(EmoticonPackage(dict: dict))
    }
}